package arithmetic.LeetCode;

import static utils.ListNodeUtils.createLink;
import static utils.ListNodeUtils.printLink;

import org.junit.jupiter.api.Test;

import utils.ListNodeUtils.ListNode;


/**
 * 82. 删除排序链表中的重复元素 II
 *
 * 给定一个已排序的链表的头 head ， 删除原始链表中所有重复数字的节点，只留下不同的数字 。返回 已排序的链表 。
 *
 *
 * 示例 1：
 * 输入：head = [1,2,3,3,4,4,5]
 * 输出：[1,2,5]
 *
 * 示例 2：
 * 输入：head = [1,1,1,2,3]
 * 输出：[2,3]
 *
 *
 *
 * 提示：
 *
 * 链表中节点数目在范围 [0, 300] 内
 * -100 <= Node.val <= 100
 * 题目数据保证链表已经按升序 排列
 *
 * https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/
 *
 * @author jiangfeng on 2022/6/8
 */
public class RemoveRepeatLink {


    @Test
    public void test(){
        //
        ListNode listNode = createLink(new int[] {1, 2, 3, 3, 4, 4, 5});
        printLink(listNode);
        printLink(deleteDuplicates(listNode));

    }

    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode dummyHead = new ListNode(),index = dummyHead;
        dummyHead.next = head;
        // 使用index.next 可以多操作个指针,
        while (index.next!=null && index.next.next!=null) {
            //if(index.val == index.next.val){
            if(index.next.val == index.next.next.val){
                int val = index.next.val;
                // 持有住index 指针,用 index.next 指针取游走
                while(index.next!=null  && index.next.val == val){
                    index.next = index.next.next;
                }
            }else{
                index = index.next;
            }
        }
        return dummyHead.next;


    }


    public ListNode deleteDuplicates2(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode dummyHead = new ListNode(),index = head, preIndex = dummyHead;
        dummyHead.next = head;
        while (index != null) {
            if(index.next!=null  && index.val == index.next.val){
                int val = index.val;
                while(index!=null  && index.val == val){
                    index = index.next;
                }
                // 此时index  val不为index.
                preIndex.next = index;
            }else{
                preIndex = index;
                index = index.next;
            }
        }
        return dummyHead.next;

    }



}
